home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-1.iso / Files / System 7 / Frontier / Frontier SDK 2.1.sit / Frontier SDK 2.1 / Sample Code / Apple Events 101 / Server / server.c next >
Encoding:
C/C++ Source or Header  |  1993-05-21  |  7.7 KB  |  456 lines  |  [TEXT/KAHL]

  1.  
  2. /*© Copyright 1993 UserLand Software, Inc.  All Rights Reserved.*/
  3.  
  4. #include <AppleEvents.h>
  5.  
  6.  
  7. #define applemenu 128 
  8. #define aboutitem 1 
  9.  
  10. #define filemenu 129
  11. #define quititem 1
  12.  
  13. MenuHandle happlemenu, hfilemenu; 
  14.  
  15. WindowPtr mainwindow = nil;
  16.  
  17. Str255 windowmessage; 
  18.  
  19. Boolean flexitmainloop = false; 
  20.  
  21. Boolean flcurrentlyactive = true;
  22.  
  23.  
  24.  
  25.  
  26. static void initMacintosh (void) {
  27.  
  28.     /*
  29.     the magic stuff that every Macintosh application needs to do 
  30.     before doing anything else.
  31.     */
  32.  
  33.     short i;
  34.         
  35.     MaxApplZone ();
  36.     
  37.     for (i = 0; i < 10; i++) 
  38.         MoreMasters ();
  39.     
  40.     InitGraf (&qd.thePort);
  41.     
  42.     InitFonts ();
  43.     
  44.     FlushEvents (everyEvent, 0);
  45.     
  46.     InitWindows ();
  47.     
  48.     InitMenus ();
  49.     
  50.     TEInit ();
  51.     
  52.     InitDialogs (nil);
  53.     
  54.     InitCursor ();
  55.     
  56.     for (i = 0; i < 5; i++) { /*register with Multifinder*/
  57.         
  58.         EventRecord ev;
  59.         
  60.         EventAvail (everyEvent, &ev); /*see TN180 -- splash screen*/
  61.         } /*for*/
  62.     } /*initMacintosh*/
  63.  
  64.  
  65. static void initAppMenus (void) {
  66.     
  67.     happlemenu = GetMenu (applemenu); 
  68.     
  69.     AddResMenu (happlemenu, 'DRVR'); 
  70.     
  71.     InsertMenu (happlemenu, 0); 
  72.     
  73.     hfilemenu = GetMenu (filemenu); 
  74.     
  75.     InsertMenu (hfilemenu, 0);
  76.     
  77.     DrawMenuBar ();
  78.     } /*initAppMenus*/
  79.  
  80.  
  81. static Boolean initMainWindow (void) {
  82.     
  83.     mainwindow = GetNewWindow (128, nil, (WindowPtr) -1);
  84.     
  85.     if (mainwindow == nil)
  86.         return (false);
  87.     
  88.     ShowWindow (mainwindow);
  89.     
  90.     return (true);
  91.     } /*initMainWindow*/
  92.  
  93.  
  94. static void ellipsize (Str255 s, short width) {
  95.  
  96.     /*
  97.     if the string fits inside the given number of pixels, fine -- do nothing
  98.     and return.
  99.     
  100.     if not, return a string that does fit, with ellipses representing the 
  101.     deleted characters.  ellipses are generated by pressing option-semicolon.
  102.     */
  103.     
  104.     char len;
  105.     short newwidth;
  106.     
  107.     if ((newwidth = StringWidth (s)) <= width) /*nothing to do, the string fits*/
  108.         return;
  109.     
  110.     len = s [0]; /* current length in characters*/
  111.     
  112.     width -= CharWidth ('…'); /* subtract width of ellipses*/
  113.         
  114.     do { /*until it fits (or we run out of characters)*/
  115.     
  116.         newwidth -= CharWidth (s [len]);
  117.         
  118.         --len;
  119.     } while ((newwidth > width) && (len != 0));
  120.     
  121.     ++len; /*make room for the ellipses*/
  122.     
  123.     s [len] = '…'; 
  124.     
  125.     s [0] = (char) len;
  126.     } /*ellipsize*/
  127.  
  128.  
  129. static void centerString (Rect r, Str255 s) {
  130.     
  131.     /*
  132.     draw the string in the current font, size and style, centered inside
  133.     the indicated rectangle.
  134.     */
  135.     
  136.     short rh = r.bottom - r.top;
  137.     short rw = r.right - r.left;
  138.     short h, v;
  139.     FontInfo fi;
  140.     
  141.     GetFontInfo (&fi);
  142.     
  143.     ellipsize (s, rw); /*make sure it fits inside the rectangle, width-wise*/
  144.     
  145.     h = r.left + ((rw - StringWidth (s)) / 2);
  146.     
  147.     v = r.top + ((rh - (fi.ascent + fi.descent)) / 2) + fi.ascent;
  148.     
  149.     MoveTo (h, v);
  150.     
  151.     ClipRect (&r);
  152.     
  153.     DrawString (s);
  154.     } /*centerString*/
  155.  
  156.  
  157. static void setFontSizeStyle (short fontnum, short fontsize, short fontstyle) {
  158.  
  159.     TextFont (fontnum);
  160.     
  161.     TextSize (fontsize);
  162.     
  163.     TextFace (fontstyle);
  164.     } /*setFontSizeStyle*/
  165.     
  166.     
  167. static void updateMainWindow (void) {
  168.     
  169.     Rect r;
  170.     Str255 s;
  171.     
  172.     r = (*mainwindow).portRect;
  173.     
  174.     EraseRect (&r);
  175.     
  176.     setFontSizeStyle (helvetica, 18, bold);
  177.     
  178.     centerString (r, windowmessage);
  179.     
  180.     NumToString (FreeMem () / 1024, s);
  181.     
  182.     MoveTo (r.left + 3, r.bottom - 3);
  183.     
  184.     setFontSizeStyle (geneva, 9, 0);
  185.     
  186.     DrawString (s);
  187.     
  188.     DrawString ("\pK");
  189.     } /*updateMainWindow*/
  190.     
  191.     
  192. static void handleUpdate (EventRecord *ev) {
  193.     
  194.     WindowPtr w;
  195.     
  196.     w = (WindowPtr) (*ev).message;
  197.     
  198.     BeginUpdate (w);
  199.     
  200.     SetPort (w);
  201.     
  202.     updateMainWindow ();
  203.     
  204.     EndUpdate (w);
  205.     } /*handleUpdate*/
  206.  
  207.  
  208. static void handleDrag (EventRecord *ev, WindowPtr w) {
  209.     
  210.     Rect r;
  211.  
  212.     r = qd.screenBits.bounds; 
  213.     
  214.     r.top = r.top + GetMBarHeight (); 
  215.     
  216.     InsetRect (&r, 4, 4);
  217.     
  218.     DragWindow (w, (*ev).where, &r);
  219.     } /*handleDrag*/
  220.  
  221.  
  222. static void handleMenu (long codeword) {
  223.     
  224.     short idmenu, iditem;
  225.     
  226.     iditem = LoWord (codeword);
  227.     
  228.     idmenu = HiWord (codeword);
  229.     
  230.     switch (idmenu) {
  231.     
  232.         case applemenu: 
  233.             switch (iditem) {
  234.                 
  235.                 case aboutitem:
  236.                     Alert (262, nil);
  237.                     
  238.                     break;
  239.             
  240.                 default: {
  241.                     Str255 s;
  242.                     
  243.                     GetItem (happlemenu, iditem, s);
  244.                     
  245.                     OpenDeskAcc (s);
  246.                     
  247.                     break;
  248.                     }
  249.                 } /*switch*/
  250.             
  251.             break; /*apple menu*/
  252.  
  253.         case filemenu: 
  254.             switch (iditem) {
  255.                 
  256.                 case quititem:
  257.                     flexitmainloop = true;
  258.                     
  259.                     break;
  260.                 } /*switch*/
  261.             
  262.             break; /*file menu*/
  263.             
  264.         } /*switch*/
  265.         
  266.     exit:
  267.     
  268.     HiliteMenu (0);
  269.     } /*handleMenu*/
  270.  
  271.  
  272. static void handleMouse (EventRecord *ev) {
  273.  
  274.     short part;
  275.     WindowPtr w;
  276.     
  277.     switch (FindWindow ((*ev).where, &w)) {
  278.     
  279.         case inMenuBar: 
  280.             handleMenu (MenuSelect ((*ev).where)); 
  281.             
  282.             break;
  283.         
  284.         case inSysWindow:
  285.             SystemClick (ev, w); 
  286.             
  287.             break;
  288.         
  289.         case inDrag:
  290.             handleDrag (ev, w);
  291.             
  292.             break;
  293.         } /*switch*/
  294.     } /*handleMouse*/
  295.  
  296.  
  297. static void handleEvent (EventRecord *ev) { 
  298.     
  299.     switch ((*ev).what) {
  300.     
  301.         case keyDown: case autoKey: 
  302.             if ((*ev).modifiers & cmdKey)
  303.                 handleMenu (MenuKey ((*ev).message & charCodeMask)); 
  304.             
  305.             break;
  306.             
  307.         case mouseDown:
  308.             handleMouse (ev);
  309.             
  310.             break;
  311.         
  312.         case updateEvt:
  313.             handleUpdate (ev);
  314.             
  315.             break;
  316.         
  317.         case osEvt:
  318.             flcurrentlyactive = ((*ev).message & resumeFlag) != 0;
  319.             
  320.             break;
  321.         
  322.         case kHighLevelEvent:
  323.             AEProcessAppleEvent (ev);
  324.             
  325.             break;
  326.         } /*switch*/
  327.     } /*handleEvent*/
  328.  
  329.  
  330. static void AEReturnError (AppleEvent *reply, OSErr errornum, Str255 errorstring) {
  331.     
  332.     AEPutParamPtr (reply, keyErrorNumber, typeShortInteger, (Ptr) &errornum, sizeof (errornum));
  333.         
  334.     AEPutParamPtr (reply, keyErrorString, typeChar, (Ptr) &errorstring [1], errorstring [0]);
  335.     } /*AEReturnError*/
  336.     
  337.         
  338. static pascal OSErr openAppEvent (AppleEvent *event, AppleEvent *reply, long refcon) {
  339.     
  340.     return (noErr);
  341.     } /*openAppEvent*/
  342.  
  343.  
  344. static pascal OSErr openDocEvent (AppleEvent *event, AppleEvent *reply, long refcon) {
  345.     
  346.     return (noErr);
  347.     } /*openDocEvent*/
  348.     
  349.         
  350. static pascal OSErr printEvent (AppleEvent *event, AppleEvent *reply, long refcon) {
  351.     
  352.     return (noErr);
  353.     } /*printEvent*/
  354.     
  355.     
  356. static pascal OSErr setMessageEvent (AppleEvent *event, AppleEvent *reply, long refcon) {
  357.  
  358.     AEDesc result;
  359.     OSErr ec;
  360.     long len;
  361.     
  362.     ec = AEGetParamDesc (event, keyDirectObject, typeChar, &result);
  363.     
  364.     if (ec != noErr) {
  365.         
  366.         AEReturnError (reply, ec, "\pThe setmessage event requires a text parameter.");
  367.         
  368.         return (false);
  369.         }
  370.         
  371.     len = GetHandleSize (result.dataHandle);
  372.     
  373.     if (len > 255) /*it must fit in a Str255*/
  374.         len = 255;
  375.         
  376.     windowmessage [0] = len; /*set the length of the string*/
  377.     
  378.     BlockMove (*result.dataHandle, &windowmessage [1], len);
  379.     
  380.     AEDisposeDesc (&result);
  381.     
  382.     SetPort (mainwindow);
  383.     
  384.     InvalRect (&(*mainwindow).portRect);
  385.     
  386.     /*convert the string to a number, return it to the client*/ {
  387.         
  388.         long num;
  389.         
  390.         StringToNum (windowmessage, &num);
  391.         
  392.         AEPutParamPtr (reply, keyDirectObject, typeLongInteger, (Ptr) &num, sizeof (num));
  393.         }
  394.     
  395.     return (noErr);
  396.     } /*setMessageEvent*/
  397.     
  398.     
  399. static pascal OSErr quitEvent (AppleEvent *event, AppleEvent *reply, long refcon) {
  400.     
  401.     flexitmainloop = true;
  402.     
  403.     return (noErr);
  404.     } /*quitEvent*/
  405.     
  406.     
  407. static Boolean installhandlers (void) {
  408.  
  409.     if (AEInstallEventHandler ('SERV', 'DISP', setMessageEvent, 0, false) != noErr)
  410.         return (false);
  411.     
  412.     if (AEInstallEventHandler (kCoreEventClass, kAEOpenApplication, openAppEvent, 0, false) != noErr)
  413.         return (false);
  414.     
  415.     if (AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, openDocEvent, 0, false) != noErr)
  416.         return (false);
  417.     
  418.     if (AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments, printEvent, 0, false) != noErr)
  419.         return (false);
  420.     
  421.     if (AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, quitEvent, 0, false) != noErr)
  422.         return (false);
  423.     
  424.     return (true);
  425.     } /*installhandlers*/
  426.     
  427.  
  428. void main (void) {
  429.     
  430.     EventRecord ev;
  431.     
  432.     initMacintosh ();
  433.     
  434.     if (!installhandlers ()) {
  435.     
  436.         Alert (261, nil); /*couldn't install Apple Event handlers*/
  437.         
  438.         return;
  439.         }
  440.     
  441.     initAppMenus ();
  442.     
  443.     initMainWindow ();
  444.     
  445.     while (!flexitmainloop) {
  446.         
  447.         WaitNextEvent (everyEvent, &ev, 1, nil);
  448.         
  449.         handleEvent (&ev);
  450.         } /*while*/
  451.     } /*main*/
  452.  
  453.  
  454.  
  455.  
  456.